Sur cette page, des
exemples de scripts utilisant le langage
Batch.
Pages complémentaires : généralités
sur le langage Batch.
Copier des fichiers
de différentes extensions
Servez-vous de ce modèle de script :
for %%a in ( %1 %2 %3 %4 %5 %6 %7 %8 %9) do xcopy *.%%a c:\sauvegarde
/s /y
Lancez votre fichier Batch en le faisant suivre du nom des extensions
voulues.
Nous créons une boucle de contrôle qui va pour chaque
paramètre passé à la suite de notre fichier
Batch entamer le processus de copie vers le répertoire
C:\Sauvegarde.
Spécifier un
groupe de commandes dans un fichier
Créez un fichier nommé Fichier.txt dans lequel vous
allez copier ce contenu :
attrib -h -s
attrib -a
attrib -r
attrib
Dans un nouveau fichier Batch nommé Test.bat copiez ce
contenu :
for /f "delims=" %%a in (fichier.txt) do %%a *.%1
La commande permettant d'exécuter ces quatre opérations
sur tous les fichiers *.bmp est celle-ci : test bmp
Le principe est de lire le contenu du fichier ligne par ligne
et pour chaque objet trouvé par la commande "For".
La variable %1 remplace le premier paramètre saisi par
l'utilisateur à la suite du nom du fichier Batch.
Le mot-clé "Delims" est nécessaire sinon
il n'est pas tenu compte des espaces dans le parcours des commandes
inscrites dans le fichier.
Créer un fichier
texte en se servant de la commande Echo
Nous nous sommes inspiré d'une suggestion faite par Jerold
Schulman à partir de son site : www.jsiinc.com. Le principe
est très simple : nous allons encore une fois nous servir
des parenthèses. Imaginons que nous souhaitions désinstaller
complètement la machine virtuelle Java, il nous suffira
de supprimer certaines données de l'Explorateur Windows
ainsi que du Registre Windows. Dans ce dernier cas nous allons
créer un fichier .reg qui une fois enregistré permettra
d'opérer les modifications nécessaires. Créez
un nouveau fichier Batch en saisissant ceci :
@echo off
rd /s /q %SystemRoot%\JAVA
del /q %systemroot%\inf\java.pnf
del /q %systemroot%\system32\jview.exe
del /q %systemroot%\system32\wjview.exe
(
@echo Windows Registry Editor Version 5.00
@echo/
@echo [-HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Java VM]
@echo/
@echo [-HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Internet Explorer\AdvancedOptions\JAVA_VM]
@echo/
) >"%Temp%\Java.reg"
regedit /s "%Temp%\Java.reg"
del /q "%Temp%\Java.reg"
Dans un premier temps, nous supprimons le répertoire Java
placé dans \Windows. À partir de ce même emplacement
nous effaçons les fichiers Java.pnf, Jview.exe et Wjview.exe.
Il nous reste plus qu'à supprimez ces deux clés
du Registre :
HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Java VM et HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Internet
Explorer\AdvancedOptions\JAVA_VM
Il suffit dans ce cas d'ajouter le préfixe - au début
du nom de la clé. Pour ce faire nous allons utiliser la
commande Echo en créant un fichier de commande temporaire
placée entre deux parenthèses. De cette façon,
c'est l'ensemble des lignes commençant par @echo qui seront
redirigées vers un seul et même fichier .reg. Il
nous reste plus qu'à l'enregistrer dans le répertoire
Temp sous le nom de Java.reg.
La commande regedit /s nous permet en suite de fusionner les informations
contenues dans ce fichier au Registre Windows.
Pour terminer il nous reste plus qu'à supprimer le fichier
Java.reg.
Nommer un fichier de
manière incrémentielle
Dans un nouveau fichier Batch copiez ce contenu
:
@echo off
set nombre=
:Boucle
if not exist Document%nombre%.txt goto Copie
set /a nombre+=1
goto Boucle
:Copie
copy Document.txt Document%nombre%.txt
Nous nous proposons dans ce Batch de renommer automatiquement
un fichier nommé Document.txt en le numérotant à
chaque fois.
Nous créons une structure de boucle avec un "compteur"
qui n'est pas encore initialisé. Nous assignons au compteur
un nom de variable nommée %nombre%.
Le script démarre ensuite les commandes contenues dans
l'étiquette :Boucle.
Si un fichier portant ce nom existe déjà nous incrémentons
la variable %nombre% d'un pas de 1 et nous retournons au début
de notre boucle.
Sinon nous exécutons les commandes spécifiées
sous l'étiquette :Copie : le fichier précédent
est copié puis renommé en ajoutant à son
nom la variable %nombre%.
Copier les fichiers
en les renommant par incrémentation
C'est un prolongement du script précédent... Dans
un nouveau fichier Batch copiez ce contenu :
set compteur=0
set rep1= c:\source
set rep2= c:\destination
for /f "tokens=1-2 delims=." %%a in ('dir /b %Rep1%')
do (
call Copie "%%a" "%%b"
)
Dans un nouveau fichier Batch (dans notre exemple, nommé
Copie.bat) copiez ce contenu :
set nom=%~1
set extension=%~2
set /a compteur+=1
set fichier=%nom%%compteur%.%extension%
copy %rep1%\"%nom%.%extension%" %rep2%\"%fichier%"
Le script va renommer automatiquement chaque fichier copié
en leur attribuant un numéro de traitement.
Nous définissons une variable et deux répertoires.
La troisième ligne permet de supprimer le . entre le nom
du fichier et son extension ("delims=.") et de décomposer
le résultat en deux blocs distincts ("tokens=1-2").
Pour chaque objet trouvé dans le répertoire "source"
nous appelons l'autre fichier Batch.
Au nom et à l'extension. du fichier sont attribuées
respectivement deux variables nommées %nom% et %extension%.
La variable %compteur% est incrémenté d'un pas de
1.
Une variable nommée %fichier% est créée en
ajoutant à la suite de la variable %nom% la valeur de %compteur%.
Nous copions le fichier correctement renommé dans le répertoire
de destination.
Les guillemets permettent de copier également les noms
de fichiers comportant des espaces.
Une autre méthode permettant de renommer des fichiers
Nous nous inspirons d'une solution proposée par Timo Salmi
à partir de cette page Web : www.uwasa.fi/~ts/http/http2.html#batch.
Dans un nouveau fichier Batch copiez ce contenu :
@echo off
set compteur=1
for /f %%a in ('dir c:\scripts\*.txt /b /s /-c /a:-d-s-h') do
(
call :menu %%a)
set compteur=
goto :eof
:menu
set fichier=%~d1& set chemin=%~p1& set nom=%~n1& set
extension=%~x1
ren %fichier%%chemin%%nom%%extension% %nom%.%compteur%%extension%
set /a compteur+=1
goto :eof
Nous initialisons la variable %compteur% sur 1. Nous effectuons
un balayage de la sortie de la commande "Dir" en appelant
pour chaque ligne trouvée les commandes placées
sous l'étiquette :menu. Chaque fichier sera décomposé
entre son nom et son extension. Puis il sera renommé en
accolant la valeur de la variable %compteur%. Cette dernière
sera à chaque fois incrémentée d'un pas de
un.
Supprimer tous les
fichiers dans tous les répertoires spécifiés
Dans cet exemple nous allons supprimer tous les fichiers contenus
dans tous les répertoires nommés Temp.
@echo off
for /f "delims=" %%a in ('dir c:\ /b /ad /s ^| findstr
/i \%1') do echo del "%%a\*.*"
Saisissez le nom du fichier Batch suivi du nom du répertoire
à "vider".
La commande findstr /i \Temp nous permet de retrouver toutes les
arborescences contenant la chaîne de caractères "Temp"
et qui seront affichées par "Dir".
Vous devez préfixer le symbole de redirection | du signe
^ puisque qu'il fait partie des caractères réservés.
Enfin, nous allons supprimer tous les fichiers présents
dans chacune des arborescences trouvées.
Une manière de supprimer des fichiers
différents
Dans un nouveau fichier Batch (nommé Test) copiez ce contenu
:
@echo off
:Boucle
del *.%1
shift
if not "%1" == "" goto Boucle
Il vous suffire alors de saisir ce type de commande : test txt
doc exe
le script démarre en supprimant les fichiers portant l'extension
du premier paramètre saisi par l'utilisateur à la
suite du nom du fichier Batch.
La commande "Shift" permet de décaler la variable
%1 ce qui permet de traiter le second paramètre (doc).
Si une nouvelle variable est trouvée (si %1 n'est pas égale
à "") alors nous reprenons le script à
partir de l'étiquette :Boucle.
Une manière
de déplacer des fichiers différents
Dans un nouveau fichier Batch (nommé Test) copiez ce contenu
:
for %%a in (%1 %2 %3 %4 %5 %6 %7 %8 %9) do move "%%a"
c:\destination
Il vous suffire alors de saisir ce type de commande : test *.txt
*.doc *.exe
Là encore, le principe est très similaire à
ce qui était expliqué auparavant sauf sue nous n'opérons
pas de décalage de variable en nous servant de la commande
"Shift".
Cela revient à saisir directement cette commande :
for %a in (*.txt *.doc *.exe) do move "%a" c:\destination
Il est préférable de placer entre guillemets la
seconde variable %a si les noms des fichiers traités comportent
des espaces.
Ajouter ou remplacer
un ou plusieurs fichiers
Dans un nouveau fichier Batch (nommé test) copiez ce contenu
:
replace %1\*.* %2 /a
replace %1\*.* %2 /u
Saisissez, par exemple, cette commande : batch c:\source c:\destination
Opérez des modifications dans les fichiers placés
dans le répertoire source puis à nouveau lancez
la même commande en appuyant sur la touche F3. Il vous est
possible de synchroniser les deux répertoires en remplaçant
le contenu du fichier Batch par ceci :
replace %1\*.* %2 /a
replace %1\*.* %2 /u
replace %2\*.* %1 /a
replace %2\*.* %1 /u
Décomposer la
date d'aujourd'hui
Voici une méthode assez simple. Dans un nouveau fichier
Batch copiez ce contenu :
for /f "tokens=1-3 delims=/" %%f in ("%date%")
do (
set datation=%%f%%g%%h
set jour=%%f
set mois=%%g
set année=%%h)
echo %datation%
echo J=%jour% M=%mois% A=%année%
Dans ce cas, nous procédons à l'analyse de la variable
%date% tel qu'elle apparaît en saisissant ceci : echo %date%
En nous servant du mot clé "delims=/" nous supprimons
les barres tranversales.
Le mot-clé "tokens" nous permet de passer les
trois blocs de données en trois variables nommées
%f, %g et %h.
Le reste du script n'est qu'un jeu sur les variables : nous considérons
qu'il est plus rapide de se servir d'une variable composée
d'une seule lettre que d'un mot.
Une autre solution consiste à extraire directement les
informations utiles à partir de la variable prise textuellement
:
set jour=%date:~0,2%
set mois=%date:~3,2%
set année=%date:~5,4%
@echo Nous sommes le %jour%/%mois%/%année%
Insérer une
date dans un nom de fichier
Ceci peut en être un exemple :
echo sauvegarde_%date:~0,2%%date:~3,2%%date:~6,4%.txt
Nous pouvons imaginer toute sorte de "formatage" de
la variable %date%...
Lister les fichiers
correspondant à une date de modification
Nous inspirons d'un exemple de script proposé par Timo
Salmi à partir de son site web : www.uwasa.fi/~ts/http/http2.html#batch.
Dans un nouveau fichier Batch copiez ce contenu :
@echo off
set dossier=%1
set année=%2
set dossier1=dir /b /s %dossier%
set année1=findstr /l /c:"%année%"
for /f "tokens=*" %%c in ('%dossier1%') do (
set fichier=%%c
call :commande
)
goto :eof
:commande
for /f %%c in ('dir "%fichier%" ^|%année1%')
do @echo %fichier%
La syntaxe permettant de lancer ce Batch est celle-ci : Nom_Batch
Répertoire Année. Par exemple : test c:\source 2004
Nous définissons quatre variables :
%1 : le premier paramètre saisi par l'utilisateur qui sera
le nom du répertoire.
%2 : le second paramètre saisi par l'utilisateur qui sera
l'année de modification.
%dossier1% : le résultat de la commande "Dir"
qui trie les fichiers en fonction de leur date de modification.
%année1% : le résultat d'une recherche portant sur
l'expression "2004" si l'année spécifiée
est 2004.
Pour chaque ligne trouvée dans la sortie de la commande
"Dir" il est alors demandé de :
Définir une variable nommée %c
D'appeler les instructions spécifiées sous l'étiquette
:commande.
Chaque ligne contenant l'expression définie par la variable
%année% sera affichée en utilisant la commande "Echo".
Lister tous les fichiers
modifiés aujourd'hui
Saisissez cette commande :
dir *.* /o:n | find "%date%" | more
Créer un dossier
portant le nom de la date d'aujourd'hui
Dans un nouveau fichier Batch copiez ce contenu :
@echo off
for /f "tokens=1-3 delims=/" %%a in ('date /t') do set
dossier=c:\sauvegarde\%%a%%b%%c
md %dossier%
copy c:\test\*.txt %dossier%
Nous nous proposons dans cet exemple de copier tous les fichiers
Texte placés dans C:\Test dans un répertoire que
nous allons créer et qui portera le nom de la date d'aujourd'hui.
Le principe est assez simple :
Nous nous servons de la commande "For" pour extraire
trois variables "tokens=1-3" de la commande "date
/t".
Une fois ces trois variables extraites nous créons une
variable nommé %dossier% et qui correspond à un
répertoire virtuel placé dans C:\Sauvegarde.
Le nom de ce répertoire est la date du jour. Afin d'éviter
un message d'erreur nous nous servons du paramètre "delims=/"
afin de soustraire du nom les barres transversales.
Nous créons (Md) un répertoire portant le nom de
la variable créée (%Dossier%).
Pour mieux comprendre le mécanisme de ce script saisissez
ces commandes :
for /f "tokens=1-3 delims=/" %a in ('date /t') do set
Dossier=c:\Sauvegarde\%a%b%c
À la suite du prompt sera affiché la date du jour...
md %dossier%
Vous pouvez tester ce script an accédant aux propriétés
de "Date et heure" et en changeant momentanément
la date du jour. Le même script peut être utilisé
pour réaliser des sauvegardes des fichiers en les rangeant
pas heure. Il suffit de modifier la première ligne en inscrivant
:
for /f "tokens=1-2 delims=:" %%a in ('time /t') do set
Dossier=C:\Sauvegarde\%%a%%b
md %dossier%
Copier des fichiers
en fonction de la date d'aujourd'hui
Servez vous de ce modèle de script :
for /f "tokens=1-3 delims=/ " %%a in ('date/t') do set
MMDDYY=%%b-%%a-%%c
xcopy c:\source\*.* c:\destination /D:%MMDDYY%
Il y a un piège : la commande "Xcopy" exige avec
le commutateur /d que le mois soit spécifié avant
l'indication du jour.
Pour le reste, nous extrayons de la commande "Date /t"
trois variables (mois, jour, année) qui nous servira à
spécifier à partir de quelle date de dernière
modification les fichiers seront inclus dans le processus de copie.
Copier différentes sauvegardes
d'un même fichier en les datant
Nous nous inspirons dans cet exemple d'une suggestion faite par
Jerold Schulman à partir de son site Web : www.jsiinc.com.
Dans un nouveau fichier Batch copiez ce contenu :
setlocal
for /f %%a in ('dir /b/x c:\source') do call :début %%a
endlocal
goto:eof
:début
set Nom1=%1
for /f "tokens=1,2,3 delims= /" %%a in ('date /t') do
set Date1=%%a%%b%%c
for /f "tokens=1,2 delims=: " %%d in ('time/t') do set
Heure1=%%d%%e
for %%f in (%Nom1%) do (
set Nom2=%%~nf
set Extension=%%~xf
)
set Nom3=%Nom2%-%Date1%-%Heure1%%Extension%
copy c:\source\%Nom1% c:\destination\%Nom3%
Dans ce cas, le principe est de créer des sauvegardes des
fichiers placés dans le répertoire Source dont les
différentes versions seront datées puis classées
dans un répertoire nommé Destination. Signalons
tout de suite que ce script ne fonctionne pas si le fichier contient
des espaces ou des caractères réservés.
Les lignes 1 et 3 nous permettent de réinitialiser à
chaque exécution du script les variables %nom1%, %nom2%
et %extension%.
Une fois cette précaution prise, la commande goto:eof nous
permet de sortir du fichier de script.
Le script proprement démarre en ligne n°2. Pour chaque
ligne affichée par la commande "Dir" nous allons
exécutez les commandes placées sous l'étiquette
:début.
Une variable nommée %Nom1% nous permet de récupérer
le nom du fichier affiché par "Dir".
Nous décomposons le nom complet du fichier en son nom (%%~nf)
puis son extension (%%~xf).
Par ailleurs, nous procédons à l'extraction des
commandes "Date /t" et "Time /t" des valeurs
qu'elles contiennent.
Enfin, nous créons une nouvelle variable nommée
%Nom3% qui est la concaténation des variables obtenues
précédemment.
Ne reste plus qu'à enclencher le processus de copie puis
recommencer le même processus pour le nom de fichier suivant.
Changer la date de
modification d'un fichier sans le modifier
Ce type de commande le fait :
copy /b /y "fichier.txt" +
Cela revient à ajouter au fichier que nous copions un fichier
inexistant. Aucune modification n'est alors apportée au
fichier original. En l'absence du signe + il serait indiqué
qu'il n'est pas possible de copier un fichier sur lui-même.
Créer des scripts
pour la gestion des répertoires
Nous allons écrire un script qui cherche si un répertoire
portant le nom indiqué existe bien sur un des lecteurs
spécifiés. Dans un nouveau fichier Batch saisissez
ce contenu :
@echo off
set Liste=C,D,E et F
for %%a in (%Liste%) do for /f "delims=" %%b in ('dir
/s /b /ad "%%a:\" 2^>NUL ^| findstr /i "\%~1$"')
do (
set dossier=%%b
goto :Sortie
)
echo %1 introuvable dans %Liste%
goto :eof
:Sortie
echo %dossier%
Il suffit de saisir le nom du script suivi du nom du répertoire
recherché. Nous définissons une variable nommé
%liste% qui contient les noms des lecteurs. Aussi étonnant
que cela puisse paraître la syntaxe n'a strictement aucune
importance. Seul compte l'indication des lettres de lecteur.
Suivent deux commandes "For" imbriquées l'une
dans l'autre. Afin de mieux comprendre le fonctionnement de la
seconde, saisissez ceci en Invite de commandes :
dir /s /b /ad "c:\" 2>nul | findstr /i "\destination"
Nous recherchons dans la sortie de la commande "Dir"
une occurrence qui sera "\destination".
En toute logique, si un répertoire nommé Destination
est trouvé il sera repéré par la barre transversale
qui le précède.
La redirection 2>nul permet d'éviter l'affichage d'éventuels
messages d'erreur.
Rappelons que l'emploi de l'accent circonflexe est nécessaire
pour préfixer les symboles de redirection > et | à
partir du moment qu'ils sont utilisés dans un fichier de
script.
La variable %\~1$ permet de récupérer le chemin
absolu qui mène au répertoire.
La première ligne trouvée (%b) est passée
en tant que variable et elle sera nommée %dossier%.
Il ne reste plus qu'à se rendre à l'étiquette
:Sortie et à afficher la variable obtenue.
Récupérer
l'emplacement par défaut
Afin de récupérer le chemin du répertoire
courant inspirez-vous de ce Batch :
@echo off
for /f "tokens=*" %%a in ('cd') do set chemin=%%a
echo %chemin%
Nous nous servons simplement de la commande "Cd" pour
extraire le chemin du prompt. Oui, cela peut paraître quelque
peu curieux mais ça fonctionne !
Supprimer un nombre
déterminé de fichiers dans un répertoire
donné
Dans un nouveau fichier Batch nommé Test copiez ce contenu
:
set répertoire=%1%
set fichier=%2%
set nombre=%3%
for /f "skip=%nombre%" %%a in ('dir /a:-d /b "%répertoire%\%fichier%"')
do del %répertoire%\%%a
En admettant que vous souhaitiez "écrémer"
les 5 premiers fichiers .txt dans un répertoire Source,
saisissez cette commande :
test c:\source *.txt 5
Nous définissons trois variables correspondant aux trois
paramètres saisis par l'utilisateur.
Dans la sortie écran affichée par la commande "Dir"
nous "squizzons" les cinq premières lignes affichées
correspondant aux cinq fichiers les plus anciens en bous servant
du mot clé "skip=%nombre%".
Il vous est aussi possible d'effectuer l'opération inverse
en changeant l'ordre de tri :
dir /a:-d /o:-d /b
La variable %a sera chaque nom de fichier retenu que nous reprenons
pour les supprimer un à un.
Compter le nombre d'objets
présents dans un répertoire
Dans un nouveau fichier Batch, copiez ce contenu :
@echo off
set répertoire=%1
set /a compteurA=0
set /a compteurB=0
for /f %%a in ('dir /s /b /a:-d %répertoire%\*.*') do set
/a CompteurA+=1
for /f %%a in ('dir /s /b /a:d %répertoire%\*.*') do set
/a CompteurB+=1
echo %CompteurA% fichiers %compteurB% dossiers
Saisissez le nom du script suivi du nom du répertoire à
explorer.
Nous récupérons le paramètre saisi par l'utilisateur
afin de créer une variable nommée %répertoire%.
Nous définissons deux compteurs qui sont chacun initialisés
sur 0.
La première commande va compter les fichiers. Nous nous
servons du commutateur /a:-d dans la commande "Dir"
afin de ne pas afficher les répertoires trouvés.
La seconde commande utilise la fonctionnalité inverse de
la commande "Dir".
Supprimer le contenu
d'un répertoire cible
Dans un nouveau fichier batch copiez ce contenu :
@echo off
pushd %1
del /q "*.*"
for /f "tokens=*" %%a in ('dir /b /ad') do rd /s /q
"%%a"
popd
Saisissez le nom du fichier Batch suivi de l'emplacement et du
nom du répertoire à "vider". Le répertoire
"parent" restera intact tandis que l'intégralité
de son contenu (fichiers et sous-répertoires) sera supprimé.
Le principe est de récupérer l'arborescence spécifiée
par l'utilisateur pour "pousser" (pushd) l'indicatif
à l'emplacement voulu.
La commande "Del" supprime tous les fichiers du nouveau
répertoire par défaut.
Nous utilisons la commande "Dir" afin de n'afficher
que les répertoires. Pour chaque occurrence trouvée
nous nous servons de la commande "Rd".
La dernière ligne nous permet de revenir à notre
point de départ (popd).
Analyser les fichiers
Créez un nouveau fichier Batch contenant :
@echo off
set nom=%1
for /f %%a in ('find /v /c "" ^< %nom%') do set /a
lignes=%%a
@echo Il y a %lignes% lignes dans le fichier %nom%
Saisissez le nom du fichier batch suivi du nom du fichier à
analyser. La seconde ligne du script nous permet de récupérer
le nom du fichier en nous servant de la variable %1 qui désigne
le premier paramètre saisi par l'utilisateur à la
suite de la commande.
La commande find /v /c "" affiche toutes les lignes
qui contiennent autre chose que rien (""), opère
un décompte puis affiche le total (/c).
En admettant que la recherche porte sur un fichier nommé
Fichier.txt, vous auriez pu saisir directement cette commande
:
for /f %a in ('find /v /c "" ^< fichier.txt') do
@echo Il y a %a lignes.
Créer un fichier
contenant un texte plusieurs fois répétés
Vous pouvez vous inspirer de cet exemple de fichier Batch :
@echo off
for %%a in (1 2 3 4 5 6 7 8 9) do echo Ligne %%a>>test.txt
Compter les lignes
d'un fichier et en afficher un nombre déterminé
Nous nous inspirons dans ce paragraphes et les autres scripts
portant sur l'analyse des fichiers de certains exemples publiés
par Ritchie Lawrence à partir de son site Web : www.commandline.co.uk/index.html.
Dans un nouveau document Batch copiez les lignes suivantes :
set fichier=%1
set nombre=%2
for /f %%a in ('find /v /c "" ^< %fichier%') do set
/a lignes=%%a
@echo Il y a %lignes% lignes dans le fichier %fichier%.
if %nombre% geq %lignes% set /a A=0&goto Sortie
set /a A=%lignes% - %nombre%
:Sortie
more /e +%A% %fichier%
Saisissez à la suite de votre "Batch" le nom
du fichier suivi du nombre de lignes à afficher.
Nous reprenons le principe du précédent Batch pour
la première partie du script.
Si le nombre saisi par l'utilisateur est supérieur ou égale
au nombre de lignes trouvées nous exécutons la commande
spécifiée sous l'étiquette :Sortie.
Dans le cas contraire, nous définissons la variable %A
comme étant le produit de la soustraction entre le nombre
de lignes et le nombre spécifié par l'utilisateur
puis exécutons la dernière commande du script.
Dans tous les cas, la commande "More" affiche le résultat
tel que nous l'avons voulu du contenu de notre fichier.
Vérifier la
présence d'une chaîne de caractères
Dans un nouveau fichier Batch copiez ce contenu :
@echo off
findstr "212.37.221.109 Microapp.com" %systemroot%\system32\drivers\etc\hosts
if %errorlevel%==0 goto Msg
echo 212.37.221.109 Microapp.com >> %systemroot%\system32\drivers\etc\hosts
goto :eof
:Msg
echo Le fichier Hosts est déjà à jour !
Le fichier Hosts consigne un certain nombre de sites en faisant
le lien entre l'adresse IP et le nom du site. Vous pouvez de cette
façon soit faciliter l'accès à un site (il
ne sera pas effectué de requête auprès des
serveurs DNS) ou en interdire l'accès (en spécifiant
à la suite du nom de domaine l'adresse locale de l'ordinateur).
Notre script se contente de vérifier l'existence de l'enregistrement
spécifié. Si c'est le cas (if %errorlevel%==0) alors
nous exécuterons les commandes indiquées sous l'étiquette
:Msg.
Sinon nous ajoutons la ligne d'enregistrement dans le fichier
Hosts et terminons le script par la commande goto:eof.
Supprimer ou remplacer
une chaîne de caractères dans un texte
Dans un nouveau fichier Batch saisissez ceci :
for /f "delims=" %%a in ('type "%1"') do call
:commande "%%a"
goto :eof
:commande
set ligne=%1
set ligne=%ligne:"=%
@echo %ligne% >>fichier2.txt
Dans ce script nous nous proposons de supprimer tous les guillemets...
Saisissez simplement le nom du script suivi du nom du fichier
à modifier. Une version expurgée sera automatiquement
générée.
Nous nous servons de la commande "Type" pour afficher
le contenu du fichier.
Pour chaque ligne affichée par la commande "Type"
nous créons une variable nommée %ligne%.
Dans cette variable nous opérons une substitution en remplaçant
tous les signes " par rien ("=).
La nouvelle ligne une fois formatée, nous l'"empilons"
dans un fichier nommé Fichier2.txt et ce en nous servant
de la commande "Echo".
Retrouver une chaîne
de caractères dans différents fichiers
Dans un nouveau fichier Batch copiez ce contenu :
@echo off
set dossier=%1
set filtre=%2
set chaîne=%3
for /f "tokens=*" %%a in ('dir "%dossier%\%filtre%"
/s /b') do (
for /f "tokens=*" %%z in ('type "%%a"^|findstr
/l /i /c:"%chaîne%"') do (
@echo %%ass:%%z
)
)
La syntaxe vous permettant de lancer votre fichier Batch sera
celle -ci :
Nom_Batch Emplacement Nom_Fichiers Chaîne
Par exemple et en admettant que votre fichier Batch se nomme Test.bat,
si vous souhaitez savoir quels sont les fichiers texte placés
dans C:\Source qui contiennent la chaîne de caractères
"Jean", saisissez :
Test c:\source *.txt Jean
Nous définissons trois variables qui correspondent aux
paramètres saisis par l'utilisateur.
Un jeton est alloué à chaque ligne trouvée
dans la sortie écran de la commande "Dir".
Nous obtenons à chaque fois une variable %f qui sera le
nom du fichier.
Cette variable est reprise de telle sorte que "Type"
puisse afficher le fichier spécifié.
Un autre jeton est alloué à chaque ligne trouvé
dans le fichier analysé.
La commande "Findstr" permet de filtrer que les lignes
contenant la chaîne de caractères "Jean".
Les deux variables ainsi obtenues %f et %z seront affichées
par la commande "Echo".
Trouver une même
occurrence dans plusieurs fichiers
Ce fichier Batch sait le faire :
for /f "delims=" %%a in ('findstr /m Microapp.com c:\*.*')
do echo "%%a"
Une autre manière de supprimer les guillemets ?
Si dans un fichier .txt vous avez ce type de contenu :
ligne, 1, mot, 1
ligne, 2, mot, 2
Ces deux commandes vont nous permettre d'afficher que les chiffres
ou que les chaînes de caractères :
for /f "tokens=2,4 delims=," %a in (fichier.txt) do
(echo %a %b)
for /f "tokens=1,3 delims=," %a in (fichier.txt) do
(echo %a %b)
Si, par contre le contenu du fichier ressemble à celui-ci
:
ligne "1" mot "1"
ligne "2" mot "2"
Vous devez vous inspirer de ce fichier Batch :
@echo off
setlocal EnableDelayedExpansion
for /f "tokens=*" %%a in ('type "Fichier.txt"')
do (
set ligne=%%a
echo !ligne:"=!
)>> temp.txt
for /f "tokens=1,3 delims= " %%a in (temp.txt) do (echo
%%a %%b)
del temp.txt
Tout d'abord nous précisons que nous allons nous servir
des variables dynamiques.
La commande "Type" permet d'afficher le contenu du fichier.
À chaque ligne trouvée est allouée une variable
%a.
Nous redirigeons chacune de ces lignes dans un fichier nommé
Temp.txt.
Nous nous servons de la commande "Echo" et de la variable
%ligne% mais placée, cette fois-ci, entre deux points d'exclamation.
Au passage, nous opérons une substitution en remplaçant
tous les guillemets trouvés par rien (echo !ligne:"=!).
Il suffit après de reprendre le fichier Temp.txt afin d'afficher
son contenu "transformé".
Par mesure de "propreté" nous supprimons le fichier
temporaire dont nous nous sommes servi.
Afficher les informations
d'un fichier
Dans un nouveau fichier nommé Script.bat copiez ce contenu
:
@echo off
set nom=%1%
for /f %%a in ('dir "%nom%" /s /b /-c /a:-d-s-h') do
echo %%~za octets
for /f "skip=4 tokens=1,2" %%a in ('dir "%nom%"
/tc /-c /a:-d-s-h^|find /v "(s)"') do echo Créé
le %%a %%b
for /f "skip=4 tokens=1,2" %%a in ('dir "%nom%"
/tw /-c /a:-d-s-h^|find /v "(s)"') do echo Modifié
le %%a %%b
for /f "skip=4 tokens=1,2" %%a in ('dir "%nom%"
/ta /-c /a:-d-s-h^|find /v "(s)"') do echo Dernier accès
le %%a %%b
Saisissez le nom du Batch suivi du nom du fichier à analyser.
Pour bien comprendre comment fonctionne ce script comparez ces
deux commandes :
dir "fichier.txt" /tc /-c /a:-d-s-h
dir "fichier.txt" /tc /-c /a:-d-s-h |find /v "(s)"
La seconde commande a biffé toutes les informations contenant
la chaîne de caractères "(s)" comme celle-ci
: "1 fichier(s)".
Reste maintenant à supprimer les lignes d'informations
d'en-tête. C'est le pourquoi de l'emploi du mot-clé
"skip=4". De cette façon, nous n'analysons que
la seconde ligne de la sortie écran produit par la commande
"Dir".
Je précise que le chiffre de 4 lignes ne correspond pas
à la réalité mais, curieusement, cela fonctionne
aussi bien que si nous demandons de "sauter" les cinq
premières lignes ?
Modifier un texte
Imaginons un fichier nommé Test.txt ayant ce contenu :
Colonne Colonne Colonne
Colonne Colonne Colonne
etc.
Nous souhaitons placer devant chaque colonne un numéro.
Dans un nouveau fichier Batch copiez ceci :
for /f "tokens=1,2,*" %%a in ('type test.txt') do echo
1 %%a 2 %%b 3 %%c > test.txt
Nous balayons à l'aide de la commande "For" le
fichier spécifié en envoyant à chaque bloc
rencontré le numéro de la colonne.
Si vous souhaitez revenir en arrière, créez un autre
fichier Batch avec ce contenu :
for /f "tokens=2,4,6" %%a in ('type test.txt') do echo
%%a %%b %%c > test.txt
Mettre une ligne sur une colonne
Inspirez-vous de ce modèle de script :
for /f "tokens=1,2,*" %%a in ('type test.txt') do (
echo %%a
echo %%b
echo %%c
) >> sortie.txt
Dans ce cas, le principe consiste à récupérer
chaque bloc de données puis de se servir de la commande
"Echo" pour créer un autre fichier nommé
Sortie.txt.
L'utilisation des parenthèses permet d'entasser les lignes
dans un même fichier.
Lire le contenu d'un
fichier texte
Il y a plusieurs méthodes possibles. Dans un nouveau fichier
Batch, copiez ceci :
@echo off
for /f "delims=" %%a in (test.txt) do echo %%a
for /f "delims=" %%a in ('type test.txt') do echo %%a
for /f "delims=" %%a in ('more ^< test.txt') do echo
%%a
Comme nous le voyons le contenu est identique mais certaines commandes
s'avèrent plus efficace dans le cas de scripts complexes.
Supprimer toutes les
lignes vides d'un fichier
Vous pouvez vous inspirer de ce type de fichier Batch :
@echo off
for /f "delims=" %%a in ('type fichier.txt') do echo.%%a>>fichier1.txt
Une nouvelle version du fichier sera créée...
Afficher la première
ou la dernière ligne d'un fichier
Dans un nouveau fichier Batch, copiez ceci :
@echo off
set "ligne1="
for /f "delims=" %%a in ('type fichier.txt') do (
if not defined ligne1 set ligne1=%%a
)
echo %ligne1%
Nous définissons une variable nommé" %ligne1%
que nous ne définissons pas.
Pour chaque ligne rencontrée par la commande "For"
nous définissons la variable %ligne1% sur la première
ligne puis reprenons la commande pour la seconde ligne présente
dans le fichier.
Mais puisque notre variable est déjà définie
nous ne lui attribuerons plus d'autre valeur. Et donc nous afficherons
que le contenu de la première ligne.
En sens inverse, vous pouvez utiliser ce type d'astuce :
@echo off
for /f "delims=" %%a in ('type fichier.txt') do set
"dernière=%%a"
echo %dernière%
Là, c'est beaucoup plus simple ! Nous nous contentons d'afficher
la dernière valeur trouvée pour la variable %dernière%
et c'est forcément la dernière ligne parcourue par
la commande "For".
Afficher un certain
nombre de lignes
Dans un nouveau fichier Batch, copiez ceci :
@echo off
set "lignes=%1"
set B=-1
set "C="
for /f "delims=" %%a in ('type fichier.txt') do (
set/a B+=1 & for /f %%z in ('echo %%B%%') do (
if "%%z"=="%lignes%" set C=1
)
if not defined C echo %%a
)
Il suffit de saisir le nom du script suivi du nombre de premières
lignes que nous souhaitons afficher.
Nous posons trois variables : %lignes%, %B% et %C%. Cette dernière
n'étant pas définie. La variable %lignes% correspond
au nombre de lignes saisie par l'utilisateur à la suite
du nom du Batch. La variable %B% reçoit une valeur négative
au cas où l'utilisateur ne veuille afficher qu'une ligne.
Un balayage du fichier est effectué par la commande "For"
et nous passons à l'opération suivante :
Nous incrémentons la variable %B% d'un pas de un et nous
affichons la valeur obtenue.
Un second balayage est alors effectué : si la variable
obtenue correspond au nombre de lignes spécifié
par l'utilisateur alors nous définissons la variable %C%
sur 1.
À l'inverse, si la variable %C% n'est pas définie
alors nous affichons la ligne en cours. En d'autres termes, si
%z n'est pas encore égale à %lignes% alors nous
affichons la ligne en cours. Quand la variable %z sera égale
à %lignes% alors nous n'afficherons pas la ligne en cours.
Étant donné que nous ne visualiserons que les lignes
affichées par la commande "Echo" nous garderons
l'impression que seules ces lignes ont été parcourues.
En sens inverse, voici une suggestion :
@echo off
set "lignes=%1"
for /f %%a in ('find /c /v "" ^< fichier.txt') do
set/a Suppression=%%a-lignes
for /f "delims=" %%a in ('more /e +%Suppression% ^<
fichier.txt') do echo %%a
Dans ce cas nous affichons les deux dernières lignes.
Dans un premier temps nous définissons une variable nommée
%suppression%.
La commande Find /c /v "" nous permet d'obtenir le nombre
de lignes qui ne sont pas vides.
La valeur de %suppression% s'obtient à faisant la soustraction
du nombre de lignes par le nombre de lignes à afficher.
La commande "More" nous permet de n'afficher que la
première ligne à partir de la valeur de %suppression%.
Si, par exemple, notre fichier compte 11 lignes et que nous souhaitez
afficher que les deux dernières lignes, le calcul opéré
par le Batch est le suivant : 11 - 2 = 9. Nous afficherons donc
le contenu du fichier à partir de la 9ème ligne
et donc deux lignes seront "relayées" par la
commande "Echo".
Afficher une ligne
précise
Dans un nouveau fichier Batch copiez ce contenu :
@echo off
set Numéro=%1
set "ligne="
set/a Numéro-=1
for /f "delims=" %%a in ('more/e +%%Numéro%%
^< fichier.txt') do (
if not defined ligne set "ligne=%%a"
)
echo %ligne%
Saisissez le nom du script suivi du numéro de ligne à
afficher.
Là aussi, saisissez cette commande :
echo /e +2 fichier.txt
Nous afficherons le contenu de Fichier.txt à partir de
la seconde ligne.
Nous effectuons un balayage à l'aide de la commande "For".
À chaque fois nous essayons de définir la variable
%ligne% sur la ligne en cours. Mais comme la variable %ligne%
est définie dès la première ligne trouvée
nous n'affichons que cette première ligne. Et comme la
première ligne trouvée correspond bien à
celle à partir de laquelle nous exécutons la commande,
c'est la ligne correcte qui sera relayée par la commande
"Echo".
Paramétrer les
sorties
Comparez la mise en page produite par ces trois fichiers Batch
:
echo BLABLA >sortie1.txt
echo BLABLA >>sortie1.txt
echo.|set /p=BLABLA >sortie2.txt
echo.BLABLA >>sortie2.txt
echo BLABLA ^BLABLA >sortie3.txt
Le signe ^ provoque un retour chariot.
Renvoyez le code d'erreur
d'un fichier Batch
Dans un nouveau fichier Batch copiez ce contenu :
@echo off
dir *.doc
for %%a in (5 4 3 2 1 0) do if errorlevel==%%a (
set code=%%a
goto erreur
)
:erreur
echo Le code renvoyé par la commande est %code%
Retrouver la version
d'Internet Explorer
Nous avons adapté un script proposé par Jerold Schulman
à partir de son site Web : www.jsiinc.com. Dans un nouveau
fichier Batch copiez ce contenu :
@echo off
set valeur=reg query "HKEY_LOCAL_MACHINE\Software\Microsoft\Internet
Explorer" /v Version
set version=findstr /I /L /C:"REG_SZ"
for /f "tokens=1,2,3" %%a in ('%valeur%^|%version%')
do @echo La version d'IE est : %%c
Cette information est consignée dans le Registre Windows.
Nous interrogeons donc le Registre en parcourant cette arborescence
: HKEY_LOCAL_MACHINE\Software\Microsoft\Internet Explorer.
Nous définissons une variable nommée %valeur% qui
sera la sortie écran de la commande "Reg query".
Nous posons ensuite une variable nommée %version% qui sera
la commande "Findstr" paramétrée pour
rechercher la chaîne de caractères "REG_SZ".
Enfin, nous effectuons un balayage dans la sortie écran
affichée par la commande "Findstr" (remplacée
par la variable %valeur%) et nous ne relayons que le troisième
bloc de données trouvé.
Un script pour redémarrer
votre ordinateur
Dans un nouveau fichier Batch, copiez ce contenu :
set /p question=Redémarrez votre ordinateur [O/N]?
if /i not "%question%"=="O"
@shutdown -r
Ce sera l'utilisateur qui définira la valeur de la variable
%question%. Si cette dernière est égale à
o alors nous lançons la commande "Shutdown".
Sinon, nous terminons le script en utilisant la commande "Goto
:eof".
Calculer le temps passé
sur une application
C'est une solution simple qui est proposée ici mais il
est très facile d'améliorer ce script... Dans un
nouveau fichier Batch copiez ce contenu :
@echo off
echo Lancement de Notepad >> journal.txt
for /f "tokens=*" %%a in ('date /t') do echo la date
est le %%a >> journal.txt
for /f %%a in ('time /t') do echo l'heure est le %%a >>
journal.txt
notepad
echo "Appuyez sur une touche afin d'enregistrer la date et
l'heure de fermeture..." & pause >nul
echo Fermeture de Notepad >> journal.txt
for /f "tokens=*" %%a in ('date /t') do echo la date
est le %%a >> journal.txt
for /f %%a in ('time /t') do echo l'heure est le %%a >>
journal.txt
À chaque fois que nous lançons le Batch nous ouvrirons
le Bloc-notes Windows. Tant que nous travaillerons sur cette application
le fichier batch restera ouvert. La fermeture du programme oblige
le script à afficher un message vous demandant d'appuyer
sur une touche afin de continuer son exécution. Ces évènements
seront consignés dans un fichier nommé Journal.txt.
Ainsi, à tout moment il vous sera possible de consulter
le temps passé sur tel ou tel document.
|
|